﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Working.Domínio.RecursosHumanos
{
    [Serializable]
    public class CarteiraDeTrabalho
    {
        #region Construtores ---------------------------------------------------------

        public CarteiraDeTrabalho(Funcionário funcionário, string número): 
            this(funcionário, número, string.Empty, string.Empty)
        { }

        public CarteiraDeTrabalho(Funcionário funcionário, string número, string série, string unidadeFederativa)
        {
            if(funcionário == null)
                throw new ArgumentException("Parâmetro 'funcionário' não pode ser nulo.");

            if(string.IsNullOrEmpty(número))
                throw new ArgumentException("Parâmetro 'número' não pode ser nulo.");

            this.funcionário = funcionário;
            this.número = número;
            this.série = série;
            this.unidadeFederativa = unidadeFederativa;

            this.alteraçõesSalariais = new List<AlteraçãoSalarial>();
            this.carteirasAnteriores = new List<AlteraçãoDeCarteira>();
        }

        #endregion

        #region Propriedades ---------------------------------------------------------

        private Funcionário funcionário;        

        public string Número
        {
            get { return número; }
        }
        private string número;
        
        public string Série
        {
            get { return série; }
            set { série = value; }
        }
        private string série = string.Empty;        

        public string UnidadeFederativa
        {
            get { return unidadeFederativa; }
            set { unidadeFederativa = value; }
        }
        private string unidadeFederativa = string.Empty;

        public DateTime DataDeEmissão
        {
            get { return dataDeEmissão; }
            set { dataDeEmissão = value; }
        }
        private DateTime dataDeEmissão;        

        public string LocalDeEmissão
        {
            get { return localDeEmissão; }
            set { localDeEmissão = value; }
        }
        private string localDeEmissão;

        public string Nome
        {
            get { return funcionário.Nome; }
        }

        public DateTime DataDeNascimento
        {
            get { return funcionário.DataDeNascimento; }
        }

        public string PisPasep
        {
            get { return funcionário.PisPasep; }
        }

        public string LocalDeNascimento
        {
            get { return funcionário.Naturalidade.ToString(); }
        }

        public string NomeMãe
        {
            get { return funcionário.NomeDaMãe; }
        }

        public string NomePai
        {
            get { return funcionário.NomeDoPai; }
        }

        public string Cpf
        {
            get { return funcionário.Cpf; }
        }        

        public IDocumentoIdentificação DocumentoApresentado
        {
            get { return documentoApresentado; }
            set { documentoApresentado = value; }
        }
        private IDocumentoIdentificação documentoApresentado;


        public EstadoCivil EstadoCivil
        {
            get { return estadoCivil; }
            set { estadoCivil = value; }
        }
        private EstadoCivil estadoCivil = EstadoCivil.Solteiro;        

        public List<AlteraçãoSalarial> AlteraçõesSalariais
        {
            get { return alteraçõesSalariais; }
        }
        private List<AlteraçãoSalarial> alteraçõesSalariais;

        public List<AlteraçãoDeCarteira> CarteirasAnteriores
        {
            get { return carteirasAnteriores; }
        }
        private List<AlteraçãoDeCarteira> carteirasAnteriores;                

        #endregion

        #region Métodos --------------------------------------------------------------

        public void AlterarCarteiraDeTrabalho(string número, string série, string uf, DateTime dataEmissão)
        {
            //TODO: Validação prévia sobre o campo número
            this.número = número;
            this.Série = série;
            this.UnidadeFederativa = uf;
            this.DataDeEmissão = dataDeEmissão;

            AlteraçãoDeCarteira alteração = new AlteraçãoDeCarteira();
            alteração.Número = this.número;
            alteração.Série = this.Série;
            alteração.UnidadeFederativa = uf;
            alteração.DataDeEmissão = dataDeEmissão;
            this.CarteirasAnteriores.Add(alteração);
        }




        #endregion

        #region Classes Auxiliares ---------------------------------------------------

        [Serializable]
        public class AlteraçãoSalarial: IComparable
        {            

            public DateTime DataDaAlteração
            {
                get { return dataDaAlteração; }
                set { dataDaAlteração = value; }
            }
            private DateTime dataDaAlteração;
            
            public DateTime DataDaEfetivação
            {
                get { return dataDaEfetivação; }
                set { dataDaEfetivação = value; }
            }
            private DateTime dataDaEfetivação;
            
            public decimal NovoSalário
            {
                get { return novoSalário; }
                set { novoSalário = value; }
            }
            private decimal novoSalário;
            
            public string Motivo
            {
                get { return motivo; }
                set { motivo = value; }
            }
            private string motivo;

            public int CompareTo(object obj)
            {
                int resultado = -1;
                if(obj == null)
                {
                    if(obj is AlteraçãoSalarial)
                    {
                        DateTime dataEfetivaçãoOutro = ((AlteraçãoSalarial)obj).DataDaEfetivação;
                        resultado = this.DataDaEfetivação.CompareTo(dataEfetivaçãoOutro);
                    }
                }
                return resultado;
            }
        }

        [Serializable]
        public struct AlteraçãoDeCarteira: IComparable
        {            
            public string Número
            {
                get { return número; }
                set { número = value; }
            }
            private string número;

            public string Série
            {
                get { return série; }
                set { série = value; }
            }
            private string série;

            public string UnidadeFederativa
            {
                get { return unidadeFederativa; }
                set { unidadeFederativa = value; }
            }
            private string unidadeFederativa;

            public DateTime DataDeEmissão
            {
                get { return dataDeEmissão; }
                set { dataDeEmissão = value; }
            }
            private DateTime dataDeEmissão;

            public int CompareTo(object obj)
            {
                int resultado = -1;
                if(obj == null)
                {
                    if(obj is AlteraçãoDeCarteira)
                    {
                        DateTime dataDeEmissãoOutro = ((AlteraçãoDeCarteira)obj).DataDeEmissão;
                        resultado = this.DataDeEmissão.CompareTo(dataDeEmissãoOutro);
                    }
                }
                return resultado;
            }
        }

        #endregion
    }
}
